Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

delagates και SerialPort

Îåêßíçóå áðü ôï ìÝëïò DaltonGR. Τελευταία δημοσίευση από το μέλος Dimitris Papadimitriou στις 24-07-2008, 12:13. Υπάρχουν 9 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  23-07-2008, 12:51 43623

    delagates και SerialPort

    Καλημέρα,

    Προσπαθώ να βρώ μια άκρη αλλα αυτά τα delegates με εχουν μπερδέψει.Εχω συνδέσει το GPS σε μία σειριακή πόρτα. εύκολο και απλό, στο load event της φόρμας ανοίγει η serial port. Λοιπόν θέλω όταν δέχεται πληροφορίες σημείου(latitude,longitude), έχω βάλει raise event όταν γίνεται αυτό, να ενημερώνω πάνω στην φόρμα μου 2 textboxes με αυτά τα δεδομένα. Δεν μπορώ να βρώ μια άκρη με τα delegates και background workers. Μπορείτε να με βοηθήσετε σε αυτό; Επιειδή τα δεδομένα έρχονται πολλά και γρήγορα δεν ενημερώνεται η φόρμα και φαίνετε σαν το πρόγραμμα να έχει κολλήσει.

    Θα σας είμαι υπόχρεος.

    ευχαριστώ εκ των προτέρων.

  •  23-07-2008, 14:26 43630 σε απάντηση της 43623

    Απ: delagates και SerialPort

    Σε ποιο σημείο ακριβώς θέλεις βοήθεια. Δώσε λίγο (προσοχή στο λίγο) κώδικα να καταλάβουμε.

    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  23-07-2008, 14:37 43632 σε απάντηση της 43623

    Απ: delagates και SerialPort

    στο serialport datareceive event έχω
    Dim bPortOpen As Boolean = Me.SerialPort1.IsOpen
    ιf bPortOpen Then
    Try
    Dim Buffer As String = SerialPort1.ReadLine
    Parse(Buffer)
    Catch
    End Try
    Else
    MessageBox.Show("Not open", "Serial Port")
    End If

    όπου το parse(buffer) ξεχωρίζει τα δεδομένα που στέλνει το GPS που είναι συνδεδεμένο στην σειριακή.

    έχω ένα custom event
    Public Event PositionReceived(ByVal latitude As String, ByVal longitude As String)
    όταν αλλάζει η θέση του χρήστη εμφανίζω αυτό το event ετσι
    RaiseEvent PositionReceived(Latitude, Longitude)

    τα δεδομένα λοιπόν απο αυτό το event, latitude και longitude, θέλω να τα εμφανίζω σε ένα label.

    αλλά δεν εμφανίζετε τίποτα. είναι λες και η εφαρμογή έχει κολλήσει.

  •  23-07-2008, 14:48 43633 σε απάντηση της 43632

    Απ: delagates και SerialPort

    Η σύνταξη

    Try
    ...
    Catch
    End Try

    είναι ένα από τα μεγαλύτερα σφάλματα που μπορεί να κάνει ένας προγραμματιστής. Είναι σαν να λες σε κάποιον κάνε μια δουλειά και ότι πρόβλημα έχεις μην μου πεις τίποτα!

    Βάλε κώδικα στο catch σου να κάνει κάτι με το exception. Να το γράφει κάπου, να βγάζει ένα message box.

     


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  23-07-2008, 14:56 43634 σε απάντηση της 43633

    Απ: delagates και SerialPort

    ναι σωστά , δεν είναι πρόβλημα εκεί όμως. συμφωνό ότι πρέπει να πιάνουμε τα exception αλλα στο σημείο εκείνο αφαίρεσα το message box που είχα. το raise event είναι σωστά; τις τιμές που περνώ στο event υπάρχει κάποιος άλλος τρόπος να της πάρω, μήπως είναι λάθος η σύνταξη εκεί;
  •  23-07-2008, 15:03 43635 σε απάντηση της 43634

    Απ: delagates και SerialPort

    Αν συμφωνείς τότε γιατί το αφαίρεσες το message box που είχες;

    Ξαναβάλτο για να βεβαιωθούμε ότι δεν υπάρχει κάποιο exception που κρύβεται! Αν υπάρχει τότε αυτό περιέχει την πληροφορία που χρειάζεσαι. Δεν έχει νόημα να ψάχνεις τυφλά τι συμβαίνει.


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  24-07-2008, 09:28 43650 σε απάντηση της 43635

    Απ: delagates και SerialPort

    τώρα που έβαλα σωστά το try..catch..end try

    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    Dim bPortOpen As Boolean = Me.SerialPort1.IsOpen
    If bPortOpen Then
    Try
    Dim Buffer As String = SerialPort1.ReadLine
    gps.Parse(Buffer)
    txt.Text += Buffer
    txt.Refresh()
    MsgBox(Buffer)
    Catch exep As Exception
    MsgBox(exep.Message, MsgBoxStyle.Information,
    "Σφάλμα data received")
    End Try
    Else
    MessageBox.Show("Not open", "Serial Port")
    End If
    End Sub

    με το προηγούμενο GPS δεν είχα πρόβλημα.Τώρα μου βγάζει μήνυμα ακαθόριστης λύσης..Big Smile

    "Δεν είναι δυνατή η εμφάνιση μηνύματος σφάλματος επειδή δεν είναι δυνατή η εύρεση της προαιρετικής συγκρότησης πόρων που το περιέχει."

    τι εννοά ο ποιητής;;

    ανοίγει κανονικά η θύρα COM1 αλλα δεν εμφανίζει δεδομένα.

    κατι ακόμα. μόλις βάλω σε σχόλια τα παρακάτω

    txt.Text += Buffer
    txt.Refresh()

     δουλεύει κανονικά. όπου txt είναι textbox.. και έχω βάλει ένα message box και εμφανίζει κανονικά τα δεδομένα. απο οτι φαίνεται δεν μπορεί να τα εισάγει στα κατάλληλα textbox η  labels...

  •  24-07-2008, 11:03 43654 σε απάντηση της 43650

    Απ: delagates και SerialPort

    Βλέπεις λοιπόν ότι μόλις έγραψες σωστά το try/catch προσδιόρισες αμέσως τις δυο γραμμές που έχουν το πρόβλημα. Πριν απλά ανταλλάξαμε 7 μηνύματα χωρίς λόγο και έχασες και 1-2 μέρες περιμένοντας απάντηση!

    Καταρχήν η txt.AppendText(Buffer) είναι καλύτερη από την txt.Text += Buffer. Αλλά δεν νομίζω να λύσει το πρόβλημα.

    Θα βοηθούσε επίσης (εσένα περισσότερο) αν εγκαταστήσεις αγγλικό .net runtime ή γυρίσεις τα vista σου στα αγγλικά. Έτσι θα παίρνεις τα exceptions στα αγγλικά και θα είναι ευκολότερο να τα ψάξεις στο δίκτυο και να βρεις τι σημαίνουν.

    Τέλος κάνε paste κάπου στην φόρμα σου το παρακάτω και αντί για τις δυο γραμμές που έχεις γράψε: Write2TextBox(Buffer)

        Private Delegate Sub Write2TextBoxHandler(ByVal text As String)

        Private Sub Write2TextBox(ByVal text As String)
            If Me.InvokeRequired Then
                Dim handler As New Write2TextBoxHandler(AddressOf Write2TextBox)
                Me.Invoke(handler, New Object() {text})
            Else
                txt.AppendText(text)
                txt.Refresh()
            End If
        End Sub


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  24-07-2008, 11:36 43658 σε απάντηση της 43654

    Απ: delagates και SerialPort

    ευχαριστώ παρα πολύ. με έσωσες. θα κάτσω να μελετήσω και αυτό που μου έστειλες γιατί ωραία τώρα είναι που δουλέυει αλλα πρέπει να βρώ και πώς. μην νιώθω πως είναι σαν μάυρο κουτί για εμένα.. ευχαριστώ και πάλι..
  •  24-07-2008, 12:13 43660 σε απάντηση της 43658

    Απ: delagates και SerialPort

    Εν συντομία η Invoke εκτελεί μια μέθοδο στο thread που εκτελείται το UI της φόρμας. Γενικά δεν είναι δυνατό να πειράξεις το UI από ένα thread διαφορετικό από αυτό που λειτουργεί το UI. Στην περίπτωσή σου το thread αυτό είναι το thread που διαβάζει την σειριακή. Το πρόβλημα είναι ότι αν δεν το κάνεις κανονικά θα πρέπει να πάρεις ένα άλλο exception από αυτό που παίρνεις (συγκεκριμένα το 'Cross-thread operation not valid: Control '.......' accessed from a thread other than the thread it was created on'). Δεν ξέρω γιατί δεν συμβαίνει αυτό στην περίπτωσή σου.

    Περισσότερα εδώ και εδώ.


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems